import java.util.Scanner;
import java.util.Arrays;

/*
1.画一个16*16的五子棋盘，要求棋盘内的元素是 "+"
2.打印棋盘
3.实现在线游戏输入，每下一步都要重新打印棋盘
4.判断输赢
 */
public class Gobang {
    int LENGTH = 16;
    int WIDTH = 16;
    String[][] gamearray = new String[LENGTH][WIDTH];

    // 1.画一个16*16的五子棋盘，要求棋盘内的元素是 "+"
    public Gobang() {
        // 初始化数组
        // 将数组内的 0 换成 +
        for (int i = 0; i < gamearray.length; i++) {
            for (int j = 0; j < gamearray[i].length; j++) {
                gamearray[i][j] = "+";
            }
        }
    }

    // 2.打印棋盘
    public void draw() {
    // 绘制棋盘
        // 双重for循环遍历二维数组
        for (int i = 0; i <= LENGTH; i++) {
            for (int j = 0; j <= WIDTH; j++) {
                if (i == 0 && j == 0) {
                    System.out.printf("  ");
                } else if (i == 0) {
                    // i为0时，打印j-1为16进制，绘制棋盘的横边
                    String hex = Integer.toHexString(j-1);
                    System.out.printf(" "+hex+" ");
                } else if (0 == j) {
                    // j为0时，打印i-1为16进制，绘制棋盘竖边
                    String hex = Integer.toHexString(i-1);
                    System.out.printf(hex+" ");
                } else {
                    // 绘制棋盘
                    System.out.printf(" " + gamearray[i-1][j-1] + " ");
                }
            }
            System.out.printf("%n");
        }
    }


    public int[] input(String name) {
        // do while循环接收游戏玩家的输入
        // 判断输入的坐标参数是否合理
        // 合理则根据玩家身份，将二维数组赋值，break跳出循环，返回一个包含坐标的一维整数数组
        // 不合理则继续循环
        String user;
        String value;
        if (name.equals("white")) {
            user = "白方";
            value = "1";
        } else {
            user = "黑方";
            value = "2";
        }
        int[] axis = new int[2];
        do {
            Scanner sc = new Scanner(System.in);
            System.out.printf("请%s落子：x y %n", user);
            String strinput = sc.nextLine();
            strinput = strinput.trim();  // 将输入前后去掉空格
            String[] temp = strinput.split("\\s+");  //生成一维数组，存储行列坐标

            System.out.println(Arrays.toString(temp));
            if (temp.length < 2) {
                System.out.println("缺少坐标，请重新落子");
            } else {
                int x = Integer.parseInt(temp[0]);
                int y = Integer.parseInt(temp[1]);
                if (0 <= x && x < LENGTH && 0 <= y && y < WIDTH) {
                    if (gamearray[x][y].equals("+")) {
                        gamearray[x][y] = value;
                        axis[0] = x;
                        axis[1] = y;
                        draw();
                        break;
                    } else {
                        System.out.println("当前坐标已经锁定，请重新落子");
                    }
                } else {
                    System.out.println("非法落子：x 合法区间是 0-15");
                }
            }
        } while (true);
        return axis;  //返回行列坐标的一维数组
    }

    public void playgame() {
        // do while循环
        // 1.调用用户输入
        // 2.调用判断输赢的引用类型，参数为二维数组，用户输入的行和列
        // 3.胜出跳出循环并打印胜利信息
        WinOrLoss wl = new WinOrLoss();
        String name = "white";
        int[] axisarray;
        do {
            axisarray = input("white");
            if (wl.gameWinOrLoss(gamearray,axisarray[0],axisarray[1])) {
                System.out.println("白方胜出");
                break;
            }
            axisarray = input("black");
            if (wl.gameWinOrLoss(gamearray,axisarray[0],axisarray[1])) {
                System.out.println("黑方胜出");
                break;
            }

        } while (true);
    }



    public static void main(String[] args) {
        Gobang gb = new Gobang();
        gb.draw();
        gb.playgame();
    }
}
